import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class FunctionDemo1 {
//    public static void main(String[] args) {
        /**
         * 方法引用
         * 1.需要有函数式接口
         * 2.被引用的方法必须是已经存在的方法
         * 3.被引用的方法形参和返回值必须跟抽象方法保持一致
         *
         * :: 方法引用符
         * this::printName 引用本类中已经存在的实例方法
         * super::printName 引用父类中已经存在的实例方法
         * */

//        ArrayList<String> list1 = new ArrayList<>();
//        Collections.addAll(list1, "1", "2", "3", "4", "5");
//        list1.stream().map(Integer::parseInt).forEach(System.out::println);

//        ArrayList<String> list = new ArrayList<>();
//        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");

        /**
         * 以下是为简化写法
         * */
//        list.stream().filter(new Predicate<String>() {
//            @Override
//            public boolean test(String name) {
//
//                return name.startsWith("张")&&name.length()==3;
//            }
//        }).forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });

        /**
         * 以下是为简化写法
         * 使用方法引用符号 引用本类中已经存在的静态方法
         * */
//        list.stream().filter(FunctionDemo1::checkName).forEach(FunctionDemo1::printName);
//    }

    //因为主main必须是static 所以this只能按以下示例使用
    //并且引用的方法不能是static静态方法
//    public void FunctionDemo1Start() {
//        ArrayList<String> list = new ArrayList<>();
//        list.stream().filter(FunctionDemo1::checkName).forEach(this::printName);
//    }

//    public static boolean checkName(String name){
//        return name.startsWith("张")&&name.length()==3;
//    }
//
//    public static void printName(String name){
//        System.out.println(name);
//    }
        public static void main(String[] args) {
//            ArrayList<String> list = new ArrayList<>();
//            Collections.addAll(list, "张无忌,15", "周芷若,16", "赵敏,17", "张强,18", "张三丰,19");
            //修改了Student类的构造方法 所以这里可以直接使用Student::new
            /**
             *     public Student(String string) {
             *         String[] split = string.split(",");
             *         String name = split[0];
             *         int age = Integer.parseInt(split[1]);
             *         this.name = name;
             *         this.age = age;
             *     }
             * */
//           List<Student> listAll=list.stream().map(Student::new).collect(Collectors.toList());
//            System.out.println(listAll);

//            ArrayList<String> list = new ArrayList<>();
//            Collections.addAll(list, "aaa", "bbb", "ccc", "ddd", "eee");

            /**
             *     //无参方法也可以使用::引用 必须是无参方法
             *     public String toUpperCase() {
             *         return toUpperCase(Locale.getDefault());
             *     }
             * */
//            list.stream().map(String::toUpperCase).forEach(System.out::println);


            /**
             * 引用数组的构造方法
             * Integer[]::new 返回一个Integer数组
             * */
        }

}
